﻿#include "compresshelper.h"
#include "QDir"

#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"

CompressHelper::CompressHelper(QObject *parent) : QObject(parent)
{

}





/**
 * 单例模式
 * @brief Single::GetInstance
 * @return
 */
CompressHelper& CompressHelper::INSTANCE()
{
    /**
     * 局部静态特性的方式实现单实例。
     * 静态局部变量只在当前函数内有效，其他函数无法访问。
     * 静态局部变量只在第一次被调用的时候初始化，也存储在静态存储区，生命周期从第一次被初始化起至程序结束止。
     */
    static CompressHelper single;
    return single;
}


/**
 * 将文件夹压缩成文件
 * 压缩方式为 D:/pig =》 D:/pig.tar.gz
 * @param path 输入路径
 * @param filename 输出文件，根据文件后缀自动压缩成相应的格式，目前自动识别 zip、tar.gz
 */
void CompressHelper::compress(const QString& path, const QString& filename){
    QZipWriter writer(filename);


    QDir dir(path);
    QFileInfoList fileList = dir.entryInfoList();
    // 遍历文件列表
    foreach (QFileInfo fileInfo, fileList) {
        //添加需要压缩的文件
        QFile file(fileInfo.filePath());
        if (!file.exists())
            continue;
        file.open(QIODevice::ReadOnly);
        writer.addFile(fileInfo.fileName(), file.readAll());
        file.close();
    }
    writer.close();
}

/**
 * 解压文件，并放到path中
 * @brief decompress
 * @param filename 输入文件，根据后缀名，识别 zip tar.gz 格式
 * @param path 输出路径
 */
void CompressHelper::decompress(const QString & filename, const QString& path){
    if(filename.endsWith(".zip")){
        QDir tempDir;
        if(!tempDir.exists(path)){
            tempDir.mkpath(path);
        }

        QZipReader reader(filename);
        reader.extractAll(path);
    }

}
